监测磁盘空间

du命令能够显示单个文件和目录的磁盘使用情况,-s选项用来总结目录一级的整体使用情况,这在计算单个用户使用的总体磁盘空间时很方便,下面的例子是使用du命令总结/home目录下每个用户的$HOME目录的磁盘占用情况:

1
$ sudo du -s /home/*

du还有另外一个选项参数-S(大写S),它为每个目录和子目录分别提供了总计信息,例如:

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo du -S /var/log/
4 /var/log/anaconda.ifcfg.log
20 /var/log/anaconda.log
32 /var/log/anaconda.program.log
108 /var/log/anaconda.storage.log
40 /var/log/anaconda.syslog
56 /var/log/anaconda.xlog
116 /var/log/anaconda.yum.log
4392 /var/log/audit
4 /var/log/boot.log
[...]
$

当然,我们最感兴趣的还是占用磁盘空间最多的目录,所以需要使用sort命令对du产生的输出进行排序:

1
$ sudo du -S /var/log/ | sort -rn

其中,-n选项允许按数字排序,-r选项会先列出最大数字(逆序)。
下面使用sed编辑器对输出进行优化:

1
sed '{11,$D; =}' | sed 'N; s/\n/ /'

对前十名之后的数据删除并且给每一行加上行号,此时再使用gawk命令对输出进行格式化,sed编辑器的输出会通过管道输出到 gawk命令,然后用 printf 函数打印出来:

1
2
3
4
5
$ sudo du -S /var/log/ |
> sort -rn |
> sed '{11,$D; =}' |
> sed 'N; s/\n/ /' |
> gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'

最后输出效果如下:

1
2
3
4
5
6
7
8
9
10
1: 4396 /var/log/audit
2: 3024 /var/log/sa
3: 2976 /var/log/
4: 420 /var/log/gdm
5: 152 /var/log/ConsoleKit
6: 80 /var/log/prelink
7: 4 /var/log/sssd
8: 4 /var/log/samba/old
9: 4 /var/log/samba
10: 4 /var/log/ppp

下面是完整的shell脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
CHECK_DIRECTORIES=" /var/log/home";
DATE=$(date ‘+%m%d%y’)
exec 0> disk_space_$DATE.rpt
echo "Top Ten Disk Space Usage"
echo "for $CHECK_DIRECTORIES Directories"
for DIR_CHECK in $CHECK_DIRECTORIES
do
echo ""
echo "The $DIR_CHECK Directory:"
du -S $DIR_CHECK 2> /dev/null |
sort -rn |
sed '{11,$D; =}' |
sed 'N; s/\n/ /' |
gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'
done
exit